package com.yx.changdao.web.controller;

import com.yx.changdao.common.annotation.AutoLog;
import com.yx.changdao.common.annotation.ShiroDesc;
import com.yx.changdao.common.data.Result;
import com.yx.changdao.common.entity.SysMenu;
import com.yx.changdao.common.exception.AlertException;
import com.yx.changdao.common.utils.SysUtils;
import com.yx.changdao.common.vo.menu.ChildrenVO;
import com.yx.changdao.common.vo.menu.MenuVO;
import com.yx.changdao.common.vo.menu.ZMenuTVO;
import com.yx.changdao.service.SysMenuService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.hibernate.validator.constraints.Length;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Description: <br />
 * 菜单接口
 * <p>
 * <br />
 * @Auther: Zhangjiashun
 * @create 2019/11/18 11:27
 */
@RestController
@RequestMapping(value = "/sys/menu", produces = {"application/json;charset=UTF-8"})
public class SysMenuController {
    private final SysMenuService sysMenuService;

    public SysMenuController(SysMenuService sysMenuService) {
        this.sysMenuService = sysMenuService;
    }


    //    /**
//     * 全部路由 登录之后
//     *
//     * @return Result
//     */
//    @AutoLog
//    @GetMapping("/route")
//    //@RequiresPermissions("sys:menu:list")
//    //@ShiroDesc("系统菜单:列表")
//    public Result route() throws AlertException {
//
//        List<ZMenuTVO> route = sysMenuService.route();
//        return Result.ok().data(route);
//    }

    /**
     * 根据用户权限返回路由
     * @return Result
     */
    @AutoLog
    @GetMapping("/menus")
    //@RequiresPermissions("sys:menu:list")
    //@ShiroDesc("系统菜单:列表")
    public Result menus() throws AlertException {
        List<MenuVO> menus = sysMenuService.menus();

        //针对两个首页的特殊处理
        if(SecurityUtils.getSubject().hasRole("admin")){
            menus.forEach(t -> {
                if(t.getName().equals("homee")){
                    t.setPath("/homee");
                }
            });
        }

        return Result.ok().data(menus);
    }

    /**
     * 菜单列表
     *
     * @return Result
     */
    @AutoLog
    @GetMapping("/list")
    @RequiresPermissions("sys:menu:list")
    @ShiroDesc("系统菜单:列表")
    public Result list() throws AlertException {
        return Result.ok().data(this.sysMenuService.getDisplayMenus());
    }

    /**
     * 所有菜单列表
     * @return Result
     */
    @AutoLog
    @GetMapping("/all/list")
    /*@RequiresPermissions("sys:menu:allList")
    @ShiroDesc("系统菜单:菜单权限列表")*/
    public Result allList() {
        return Result.ok().data(this.sysMenuService.getAllDisplayMenus());
    }


    /**
     * 添加菜单
     *
     * @param menu 待添加菜单
     * @return Result
     */
    @AutoLog
    @PostMapping
    @RequiresPermissions("sys:menu:add")
    @ShiroDesc("系统菜单:添加")
    public Result add(@Valid SysMenu menu) throws AlertException {
        SysMenu sysMenu = this.sysMenuService.addMenu(menu);
        if (sysMenu == null) {
            throw new AlertException("菜单添加失败");
        }
        return Result.ok("菜单添加成功");
    }


    /**
     * 更新菜单
     *
     * @param menu 需要更新的菜单。
     * @return Result
     */
    @AutoLog
    @PutMapping("/{id}")
    @RequiresPermissions("sys:menu:save")
    @ShiroDesc("系统菜单:保存")
    public Result update(
            @PathVariable("id")
            @Length(min = 1, max = 32, message = "菜单id只能在1~32位之间")
                    String menuId,
            SysMenu menu) throws AlertException {

        menu.setMenuId(menuId);
        Boolean b = this.sysMenuService.updateMenu(menu);
        if (!b) {
            throw new AlertException("菜单更新失败");
        }
        return Result.ok("菜单更新成功");
    }

    /**
     * 删除菜单
     *
     * @param menuId 待删除菜单id
     * @return Result
     */
    @AutoLog
    @DeleteMapping("/{id}")
    @RequiresPermissions("sys:menu:del")
    @ShiroDesc("系统菜单:删除")
    public Result delete(
            @PathVariable("id")
            @Length(min = 1, max = 32, message = "菜单id只能在1~32位之间")
                    String menuId) throws AlertException {

        boolean b = this.sysMenuService.delMenu(menuId);
        if (!b) {
            throw new AlertException("删除菜单失败");
        }
        return Result.ok("删除菜单成功");
    }
    @AutoLog
    @GetMapping("/{id}")
    @RequiresPermissions("sys:menu:look")
    @ShiroDesc("系统菜单:查看")
    public Result get(@PathVariable("id") String id) throws AlertException {
        SysMenu sysMenu = sysMenuService.getById(id);

        if (sysMenu == null) {
            throw new AlertException("未找到相关菜单信息");
        }

        return Result.ok().data(sysMenu);
    }

}
